package com.hong.qrpc;

import java.util.List;

/**
 * 该接口的实现类是实例化代理对象的关键，起到选择哪些服务进行调用的作用
 * 该接口应该根据传入的类去获得类上的服务名，然后再根据服务名下的生产者进行远程调用
 *
 * @Author HQT
 * @Data 2022/7/10 16:44
 */
public interface TransportSelector {
    /**
     * 初始化
     *
     * @param peers 可以连接的server端点的信息
     * @param count client和server有多少个连接
     * @param clazz client实现class
     */
    void init(List<Peer> peers, int count, Class<? extends TransportClient> clazz);

    /**
     * 选择一个客户端来和server进行交互
     *
     * @return 网络client
     */
    TransportClient select();

    /**
     * 释放用完的client
     *
     * @param client
     */
    void release(TransportClient client);

    /**
     * 关闭client
     */
    void close();

    void appendTransportClient(TransportClient client, Peer helpDistinct);

    void updateTransportClients(List<TransportClient> clients, List<Peer> helpDistinct);
}
